package com.longbo.leaf.common;

import lombok.Data;

import java.io.Serializable;

/**
 * JSON 回应类
 */
@Data
public class ApiResponse implements Serializable {

    /**
     * 状态码
     */
    private  Integer code;
    /**
     * 返回内容
     */
    private String message;
    /**
     * 返回数据
     */
    private Object data;

    /**
     * 无参构造函数 1
     */
    public ApiResponse() {
    }

    /**
     * 全参构造函数 2
     * @param code    状态码
     * @param message 返回内容
     * @param data    返回数据
     */
    public ApiResponse(Integer code, String message, Object data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 构造一个自定义的API返回 3
     * @param code
     * @param message
     * @param data
     * @return ApiResponse
     */
   public static ApiResponse of(Integer code, String message, Object data){
        return new ApiResponse(code,message,data);
   }

    /**
     * 构造一个成功且不带数据的API返回  4
     * 
     * @return ApiResponse
     */
   public static ApiResponse ofSuccess(){
       return ofSuccess(null);
   }

    /**
     * 构造一个成功且带数据的API返回 5
     * @param data 返回数据
     * @return
     */
   public static ApiResponse ofSuccess(Object data){
       return ofStatus(Status.SUCCESS,data);
   }

    /**
     * 构造一个成功且自定义消息的API返回 6
     * @param message 返回内容
     * @return
     */
   public static ApiResponse ofMessage(String message){
       return of(Status.SUCCESS.getCode(),message,null);
   }


    /**
     * 构造一个有状态的API返回 7
     * @param status 状态 {@link Status}
     * @return
     */
    public static ApiResponse ofStatus(Status status) {
        return ofStatus(status,null);
    }

    /**
     * 构造一个有状态且带数据的API返回 8
     * @param status 状态{@link IStatus}
     * @param data
     * @return
     */
   public static ApiResponse ofStatus(IStatus status, Object data){
       return of(status.getCode(),status.getMessage(),data);
   }

    /**
     * 构造一个异常的API返回  9
     * @param t  异常
     * @param <T>  {@link BaseException} 的子类
     * @return
     */
    public static <T extends BaseException> ApiResponse ofException(T t){
        return of(t.getCode(),t.getMessage(),t.getData());
    }


}
